AWSCLI v2のblobタイプの引数についてハマったお話
サーモン大好き横山です。
AWSCLI v2 インストールが楽でいいですよね。
そんな中、breaking-changeな変更にハマったお話です。
動作確認環境
$ sw_vers ProductName: Mac OS X ProductVersion: 10.15.5 BuildVersion: 19F101 $ aws --version aws-cli/2.0.26 Python/3.7.4 Darwin/19.5.0 botocore/2.0.0dev30
ACM に SSL証明書をimport しようとした時のお話
AWSCLI v2 で 以下のファイルから証明書をimportしようとしていました。
AWS マネジメントコンソールからのインポートできることは確認済です。
- cert.pem … 証明書
- chain.pem … 中間証明書
- privkey.pem … プライベートキー
acm import-certificate
のhelpを見ると、以下のようになってます。
$ aws acm import-certificate help : SYNOPSIS import-certificate [--certificate-arn <value>] --certificate <value> --private-key <value> [--certificate-chain <value>] [--tags <value>] [--cli-input-json | --cli-input-yaml] [--generate-cli-skeleton <value>] [--cli-auto-prompt <value>] OPTIONS --certificate-arn (string) The Amazon Resource Name (ARN) of an imported certificate to replace. To import a new certificate, omit this field. --certificate (blob) The certificate to import. --private-key (blob) The private key that matches the public key in the certificate. --certificate-chain (blob) The PEM encoded certificate chain. --tags (list) One or more resource tags to associate with the imported certifi- cate. Note: You cannot apply tags when reimporting a certificate. :
各pemファイルが作業ディレクトリ直下にいる場面で下記コマンドを叩きました。すると Invalid base64
というエラーが出ました。
$ aws acm import-certificate \ --certificate file://./cert.pem \ --private-key file://./privkey.pem \ --certificate-chain file://./chain.pem Invalid base64: "-----BEGIN PRIVATE KEY----- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx : (省略) xxxxxxxxxxxxxxxxxxxxxxx= -----END PRIVATE KEY-----
同様のコマンドを AWSCLI v1で叩くと成功します。
$ venv/bin/aws --version aws-cli/1.18.97 Python/3.7.3 Darwin/19.5.0 botocore/1.17.20 $ venv/bin/aws acm import-certificate \ --certificate file://./cert.pem \ --private-key file://./privkey.pem \ --certificate-chain file://./chain.pem { "CertificateArn": "arn:aws:acm:ap-northeast-1:xxxxxxxx0399:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
原因
AWS CLIバージョン2では、デフォルトでバイナリパラメータをbase64エンコードされた文字列として渡すようになったことが原因でした。
AWS CLI version 2 now passes binary parameters as base64-encoded strings by default
file://〜
- ファイルの内容をbase64エンコードされたテキストとして扱うfileb://〜
- ファイルの内容をエンコードされていないバイナリとして扱う
ですので、fileb://〜
で指定してあげれば動作します。
$ aws acm import-certificate \ --certificate fileb://./cert.pem \ --private-key fileb://./privkey.pem \ --certificate-chain fileb://./chain.pem { "CertificateArn": "arn:aws:acm:ap-northeast-1:xxxxxxxx0399:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
また、v1でもfileb://〜
で指定しても同様に動作します。
$ venv/bin/aws acm import-certificate \ --certificate fileb://./cert.pem \ --private-key fileb://./privkey.pem \ --certificate-chain fileb://./chain.pem { "CertificateArn": "arn:aws:acm:ap-northeast-1:xxxxxxxx0399:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
まとめ
v1 -> v2にバージョンが上がりbreaking-changeな部分で戸惑うこともありますが、新機能もたくさんあるので、便利なものは便利に使って行きたいですね。